<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

include_once('ExceptionDAO.php');
include_once 'util/MapError.php';
include_once 'TOCategoria.php';

/**
 * DAO para operações de banco para categoria
 * @author Douglas Rafael
 *
 */
class DAOCategoria extends CI_Model {

    /**
     * Método para <b>Listar</b> todas as categorias cadastradas.
     * @return array TOCategoria
     */
    public function get_all($init, $quant) {
        $this->db->order_by("sequencia", "ASC");
        $result = $this->db->get('categoria', $quant, $init);

        if ($result) {
            $categorias = array();
            foreach ($result->result() as $value) {
                $categoria = new TOcategoria();
                $categoria->codigo = $value->id;
                $categoria->nome = $value->nome;
                $categoria->descricao = $value->descricao;
                $categoria->sequencia = $value->sequencia;
                $categoria->status = $value->status;
                array_push($categorias, $categoria);
            }
          } else {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $categoria->nome));
        }
        return $categorias;
    }

    /**
     * Retorna o Total de registros da tabela categoria.
     * @return string total de resgistros
     */
    public function quant_all() {
        return $this->db->count_all_results('categoria');
    }

    /**
     * Método para <b>Inserir</b> categoria.
     * @param TOcategoria $categoria
     * @throws ExceptionDAO 
     */
    public function insert(TOcategoria $categoria) {
        $this->db->set('nome', $categoria->nome);
        $this->db->set('descricao', $categoria->descricao);
        $this->db->set('sequencia', $categoria->sequencia);
        $this->db->set('status', $categoria->status);

        $result = $this->db->insert('categoria');

        //Pegando o erro caso exista
        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $categoria->nome));
        }
    }

    /**
     * Método para <b>Atualizar</b> dados do categoria.
     * @param TOcategoria $categoria 
     */
    public function update(TOcategoria $categoria) {
        $this->db->set('nome', $categoria->nome);
        $this->db->set('descricao', $categoria->descricao);
        $this->db->set('sequencia', $categoria->sequencia);
        $this->db->set('status', $categoria->status);
        $this->db->where('id', $categoria->codigo);

        $result = $this->db->update('categoria');

        //Pegando o erro caso exista
        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $categoria->nome));
        }
    }

    /**
     * Método para <b>Excluir</b> categoria de acordo com o código.
     * @param TOcategoria $categoria
     * @throws ExceptionDAO 
     */
    public function delete(TOcategoria $categoria) {
        $this->db->where_in('id', $categoria->codigo);
        $result = $this->db->delete('categoria');

        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $categoria->nome));
        }
    }

    /**
     * Método para <b>Buscar</b> categoria
     * @param type $init
     * @param type $quant
     * @param type $term
     * @return array
     * @throws ExceptionDAO 
     */
    public function search($init, $quant, $term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);
        $this->db->order_by("sequencia", "ASC");

        $result = $this->db->get('categoria', $quant, $init);

       if ($result) {
            $categorias = array();
            foreach ($result->result() as $value) {
                $categoria = new TOcategoria();
                $categoria->codigo = $value->id;
                $categoria->nome = $value->nome;
                $categoria->descricao = $value->descricao;
                $categoria->sequencia = $value->sequencia;
                $categoria->status = $value->status;
                $categoria->nome_status = $categoria->get_nome_status($value->status);
                array_push($categorias, $categoria);
            }
          } else {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $categoria->nome));
        }
        return $categorias;
    }
    
    public function searchCategoriaNome($term) {
        $this->db->like('nome', $term);
        return $result = $this->db->get('categoria');
    }

    public function quant_search($term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);

        return $this->db->count_all_results('categoria');
    }
    
    /**
     * Método para <b>Listar</b> uma categori de acordo com o código.
     * @return array TOCategoria
     */
    public function get_categoria(TOCategoria $categoria) {
        $this->db->where('id', $categoria->codigo);
        $result = $this->db->get('categoria')->result();

        $categorias = array();
        if ($result->row) {
                $categoria = new TOcategoria();
                $categoria->codigo = $result->id;
                $categoria->nome = $result->nome;
                $categoria->descricao = $result->descricao;
                $categoria->sequencia = $result->sequencia;
                $categoria->status = $result->status;
                $categoria->nome_status = $categoria->get_nome_status($result->status);
                array_push($categorias, $categoria);
          } else {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $categoria->nome));
        }
        return $categorias;
    }
    
    
    /**
     * Método para <b>Listar</b> todas as categorias cadastradas.
     * @return array TOCategoria
     */
    public function get_categorias($id_item) {
        $this->db->select('c.nome');
        $this->db->from('categoria_has_item ci');
        $this->db->join('categoria c', 'c.id = ci.categoria_id');
        $this->db->where('ci.item_codigo', $id_item);
        $this->db->order_by('c.nome', 'ASC');
        $result = $this->db->get();

        if ($result) {
            $categorias = array();
            foreach ($result->result() as $categoria)
                array_push($categorias, $categoria->nome);
        } else {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg));
        }
        return $categorias;
    }

}